import os
import json
import subprocess as sbp

def process_bilibili_videos(root_dir, output_base="D:\\repo"):
    """
    批量处理 B 站缓存视频，自动合并并命名
    :param root_dir: 缓存文件根目录（例如：C:\\TEMP\\416090103）
    :param output_base: 合并后视频输出目录
    """
    # 遍历根目录下的所有子文件夹
    for root, dirs, files in os.walk(root_dir):
        # 检查是否进入 "80" 子目录（分P视频存储位置）
        if os.path.basename(root) == '80':
            video_path = os.path.join(root, 'video.m4s')
            audio_path = os.path.join(root, 'audio.m4s')
            
            # 确保音视频文件存在
            if not (os.path.exists(video_path) and os.path.exists(audio_path)):
                continue

            # 读取父目录的 entry.json 获取标题
            parent_dir = os.path.dirname(root)
            entry_json = os.path.join(parent_dir, 'entry.json')
            video_title = "未命名视频"
            
            if os.path.exists(entry_json):
                try:
                    with open(entry_json, 'r', encoding='utf-8') as f:
                        data = json.load(f)
                        video_title = data.get('title', '未命名视频').replace('/', '_')
                except:
                    pass

            # 生成输出路径（确保无重复）
            output_name = f"{video_title}.mp4"
            output_path = os.path.join(output_base, output_name)
            
            # 若文件名重复，添加序号
            counter = 1
            while os.path.exists(output_path):
                output_name = f"{video_title}_{counter}.mp4"
                output_path = os.path.join(output_base, output_name)
                counter += 1

            # 合并音视频
            sbp.run([
                'ffmpeg',
                '-i', video_path,
                '-i', audio_path,
                '-c:v', 'copy',
                '-c:a', 'copy',
                '-y',  # 覆盖已存在文件
                output_path
            ], check=True)

if __name__ == '__main__':
    cache_root = 'C:\\TEMP\\416090103'
    output_dir = f'D:\\repo\\my-mp4\\计算机网络'
    os.makedirs(output_dir, exist_ok=True)
    # 自动处理所有视频
    process_bilibili_videos(cache_root, output_dir)